;----------------------
;p13-ca.asm
;将一个全是字母，以0结尾的字符转为大写
;参数：ax
;返回： 无
;----------------------
assume cs:code
data segment
    db 'conversation',0
data ends
code segment
    start:
        call copy_new_int7ch ;安装程序
        call set_new_int7ch  ;设置程序入口
        
        mov ax,data
        mov ds,ax
        mov si,0
        
        int 7ch ;测试
        
        mov ax,4c00h
        int 21h
   
    set_new_int7ch:
        mov ax,0
        mov es,ax
        
        mov word ptr es:[7ch*4], 200h
        mov word ptr es:[7ch*4+2], 0

        ret
    copy_new_int7ch:
        mov ax,cs
        mov ds,ax
        mov si,offset capital					;设置ds:si指向源地址

        mov ax,0
        mov es,ax
        mov di,200h							;设置es:di指向目的地址
        
        mov cx,offset capital_end - capital	;设置cx为传输长度
        cld									;设置传输方向为正
        rep movsb

        ret
    capital:  
		push cx
        push si
    change:
        mov cl,[si]
        mov ch,0
        jcxz ok
        and byte ptr [si],11011111b
        inc si
        jmp short change 
    ok:
        pop si
        pop cx
        
		iret  ;CPU执行int 7ch指令进入中断例程之前，标志寄存器、当前的CS和IP被压入栈
		      ;在执行完中断例程后，应该用iret 指令恢复int 7ch执行前的标志寄存器和CS、IP的
    capital_end: nop                                            
        
code ends
end start